#include "dbworker.h"
#include "defs.h"
#include "logger.h"

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QTextStream>
#include <QTextCodec>

DBWorker::DBWorker(QObject *parent) :
    QObject(parent),
    mWorkDB(NULL),
    mIsDbLoaded(false)
{
}

bool DBWorker::openDb(const QString& dbName)
{
    if (dbName.isEmpty())
    {
        LOGGER->add("DBWorker::openDb", UkrString("Передано порожню адресу до БД!"));
        return false;
    }
    else
    {
        if (!QFile::exists(dbName))
        {
            LOGGER->add("DBWorker::openDb", UkrString("Не знайдено файлу бази: %1").arg(mDbName));
            return false;
        }
        else
        {   // All right w/ DB, opening it
            mDbName = dbName;
            mWorkDB = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", "MainConnection"));
            mWorkDB->setDatabaseName(mDbName);

            if (!mWorkDB->open())
            {
                LOGGER->add("DBWorker::openDb", UkrString("Не вдалося відкрити базу: %1")
                            .arg(mWorkDB->lastError().text()) );
                return false;
            }
            else
            {
                // DB is opened
                LOGGER->add("DBWorker::openDb", UkrString("База успішно відкрита!") );

                mIsDbLoaded = true;
            }
        }
    }
    return true;
}

bool DBWorker::createDb(const QString &dbName)
{
    if (QFile::exists(dbName))
    {
        LOGGER->add("DBWorker::createDB", UkrString("Файл БД вже існує: %1!").arg(dbName) ) ;
        return false;
    }
    else
    {
        mWorkDB = new QSqlDatabase( QSqlDatabase::addDatabase("QSQLITE",  "CreateConnection") );
        mWorkDB->setDatabaseName(dbName);

        if (!mWorkDB->open())
        {
            LOGGER->add("DBWorker::createDB", "Не вдалося створити базу:", mWorkDB->lastError().text() );
            return false;
        }
        else
        {
            LOGGER->add("DBWorker::createDB", "Файл БД створено.", dbName);
            QFile dbSchemeFile(":/dbScheme");
            dbSchemeFile.open(QIODevice::ReadOnly);
            QTextStream in(&dbSchemeFile);
            in.setCodec(QTextCodec::codecForName("UTF-8"));
            QStringList schemaTableList = in.readAll().split(";");
            foreach(const QString schemaTable, schemaTableList)
                if(!schemaTable.trimmed().isEmpty())
                {
                    QSqlQuery query(*mWorkDB);
                    bool res = query.exec(schemaTable);
                    if (!res)
                        LOGGER->add( "DBWorker::createDB, query.exec",
                                     QString("Проблема з виконанням запиту %1."
                                             "Помилка: %2.")
                                     .arg(query.lastQuery())
                                     .arg(query.lastError().text()), "" );
                    return false;
                }
        }
    }
    return true;
}

void DBWorker::closeCurrentDb()
{
    if (mWorkDB!=NULL)
    {
        mWorkDB->close();
        delete mWorkDB;
        mWorkDB = NULL;
    }
    QSqlDatabase::removeDatabase("MainConnection");
    mIsDbLoaded = false;
}
